package main

import (
	"fmt"
	"net/http"
)

// Context
// @Description: 上下文
type Context struct {
	request  *http.Request
	w        http.ResponseWriter
	index    int
	handlers []HandlerFun
}

// Next
//
//	@Description: 获取yi
//	@receiver c
func (c *Context) Next() {
	c.index++
	if c.index < len(c.handlers) {
		//具体的handler(HandlerFun) 需要传递 *Context
		c.handlers[c.index](c)
	}
}

// Abort
//
//	@Description: 拦截
//	@receiver c
func (c *Context) Abort() {
	c.index = len(c.handlers)
}

type HandlerFun func(*Context)

// Engine
// @Description: 引擎
type Engine struct {
	handlers []HandlerFun
}

// Use
//
//	@Description: 将处理函数添加到引擎的handlers切片中
//	@receiver e
//	@param f
func (e *Engine) Use(f HandlerFun) {
	e.handlers = append(e.handlers, f)
}

// ServeHTTP
//
//	@Description: 实现http.Handler接口的ServeHTTP
//	@receiver e
//	@param w
//	@param r
func (e *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	context := &Context{
		request:  r,
		w:        w,
		index:    -1,
		handlers: e.handlers,
	}
	context.Next()
}

func AuthMiddleware(c *Context) {
	fmt.Println("认证中间件")
	c.Next()
}
func LogMiddleware(c *Context) {
	fmt.Println("日志中间件")
	c.Next()
}

// main
//
//	@Description: 责任链模式：是一种行为设计模式，它允许多个对象有机会处理请求，从而避免请求的发送者与接收者之间的耦合。责任链模式将这些对象连成一条链，并沿着这条链传递请求，直到有对象处理它为止。
func main() {
	r := &Engine{}
	r.Use(LogMiddleware)
	r.Use(AuthMiddleware)

	fmt.Println("web server on :8080")
	http.ListenAndServe(":8080", r)
}
